#define _GNU_SOURCE
#include "app_serial.h"
#include "log/log.h"
#include <stdlib.h>


//初始化
SerialDevice *app_serial_init(char *filename){
    Device *device = app_device_init(filename);
    if (!device)
    {
        log_error("init device init error");
        goto DEVICE_INIT_FAIL;
    }
    
    SerialDevice *serial = realloc(device,sizeof(SerialDevice));
    if (!serial)
    {
        log_error("init serial error");
        goto SERIAL_INIT_FAIL;
    }
    if(app_serial_serBraudRate(serial,BR_115200)!=0){
        log_error("set serial baud rate error");
        goto SERIAL_INIT_FAIL;
    }
    if(app_serial_setParity(serial,Parity_None)!=0){
        log_error("set serial parity error");
        goto SERIAL_INIT_FAIL;
    }
    if(app_serial_setStopBits(serial,Stopbits_1)!=0){
        log_error("set serial stop bits error");
        goto SERIAL_INIT_FAIL;
    }
    tcflush(serial->super.fd,TCIOFLUSH);

    return serial;
SERIAL_INIT_FAIL:
    app_device_close(device);
DEVICE_INIT_FAIL:
    return NULL;



}

//设置波特率
int app_serial_serBraudRate(SerialDevice *serial,BranudRate braud_rate){
    serial->braud_rate = braud_rate;
    struct termios termios;
    //获取串口属性
    if(tcgetattr(serial->super.fd,&termios)!=0){

        log_error("get serial attr error");
        return -1;
    }
    //设置波特率
    // cfsetispeed(&termios,braud_rate);
    cfsetspeed(&termios,braud_rate);

    if(tcsetattr(serial->super.fd,TCSANOW,&termios)!=0){
        log_error("set serial attr error");
        return -1;
    }

    return 0;

}

//设置校验位
int app_serial_setParity(SerialDevice *serial,Parity parity){
    serial->parity = parity;
    struct termios termios;
    if(tcgetattr(serial->super.fd,&termios)!=0){
        log_error("get serial attr error");
        return -1;
    }
    // 修改属性（校验位）
    termios.c_cflag &= ~(PARENB| PARODD); // 清除校验位
    termios.c_cflag |= parity; // 指定校验位

    if(tcsetattr(serial->parity,TCSANOW,&termios)!=0){
        log_error("set serial attr error");
        return -1;
    }

    return 0;
}

//设置停止位
int app_serial_setStopBits(SerialDevice *serial,Stopbits stop_bits){
      serial->parity = stop_bits;
    struct termios termios;
    if(tcgetattr(serial->super.fd,&termios)!=0){
        log_error("get serial attr error");
        return -1;
    }
   // 修改属性（停止位）
    termios.c_cflag &= ~CSTOPB; // 清除停止位
    termios.c_cflag |= stop_bits; // 设置停止位

    if(tcsetattr(serial->parity,TCSANOW,&termios)!=0){
        log_error("set serial attr error");
        return -1;
    }

    return 0;
}

//设置连接类型
int app_serial_setConnectType(SerialDevice *serial,ConnectionType conn_type);
